#pragma once
#include <string>
#include <memory>
#include <grpcpp/grpcpp.h>
#include "framework/request.h"
#include "framework/response.h"
#include "service_rpc.grpc.pb.h"

namespace cpp_backend {
namespace framework {

/**
 * @brief gRPC客户端封装
 * 
 * 负责：
 * - 建立gRPC连接
 * - Request/Response与gRPC消息的转换
 * - 健康检查
 */
class GrpcClient {
public:
    /**
     * @brief 构造函数
     * @param host 服务器地址
     * @param port 服务器端口
     */
    GrpcClient(const std::string& host, int port);
    
    ~GrpcClient() = default;
    
    /**
     * @brief 同步RPC调用
     * @param request 框架请求对象
     * @return 框架响应对象
     */
    Response call(const Request& request);
    
    /**
     * @brief 健康检查
     * @return 是否健康
     */
    bool health_check();
    
    /**
     * @brief 获取endpoint
     */
    std::string endpoint() const { return endpoint_; }
    
private:
    std::string endpoint_;
    std::shared_ptr<grpc::Channel> channel_;
    std::unique_ptr<service_rpc::ServiceRPC::Stub> stub_;
    
    /**
     * @brief 转换框架Request → gRPC ServiceRequest
     */
    service_rpc::ServiceRequest convert_to_grpc_request(const Request& request);
    
    /**
     * @brief 转换gRPC ServiceResponse → 框架Response
     */
    Response convert_from_grpc_response(const service_rpc::ServiceResponse& grpc_response);
};

} // namespace framework
} // namespace cpp_backend
